package main

import "fmt"

func main() {
	computer := NewComputerFacade()
	computer.start()
}

/*
外观模式又称为门面模式，它是一种结构型模式。
引入外观模式后调用方与多个子系统的通信必须通过一个统一的外观对象进行，

 外观模式为子系统中的功能接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这些子系统更加容易使用。

*/

const (
	BOOT_ADDRESS = 0
	BOOT_SECORT  = 0
	SECTOR_SIZE  = 0
)

type CPU struct{}

func (c *CPU) Freeze() {
	fmt.Println("CPU.Freeze()")
}

func (c *CPU) Jump(position int) {
	fmt.Println("CPU.Jump()")
}

func (c *CPU) Execute() {
	fmt.Println("CPU.Execute()")
}

type Memory struct{}

func (m *Memory) Load(position int, data []byte) {
	fmt.Println("Memory.Load()")
}

type HardDrive struct {
}

func (h *HardDrive) Read(lba int, size int) []byte {
	fmt.Println("HardDrive.Read()")
	return make([]byte, 0)
}

type ComputerFacade struct {
	processor *CPU
	ram       *Memory
	hd        *HardDrive
}

func NewComputerFacade() *ComputerFacade {
	return &ComputerFacade{
		new(CPU),
		new(Memory),
		new(HardDrive),
	}
}

func (c *ComputerFacade) start() {
	c.processor.Freeze()
	c.ram.Load(BOOT_ADDRESS, c.hd.Read(BOOT_SECORT, SECTOR_SIZE))
	c.processor.Jump(BOOT_ADDRESS)
	c.processor.Execute()
}

/*
外观模式的优点

简化了调用过程，不用深入了解子系统，以防给子系统带来风险。
减少系统依赖，松散耦合。
更好地划分访问层次，提高了安全性。
遵循迪米特法则
外观模式的缺点

当增加子系统和扩展子系统行为时，需要对外观进行重复更改，不符合开闭原则，可能容易带来未知风险。
*/
